// hdu3584
// 题意：给定一个n*n*n(n<=100)大小的0, 1 cube，有两种操作：
//        1.反转一个给定子长方体里的元素（0->1或1->0）;
//        2.查询一个给定位置的元素.
//       询问有m(<=10000)个。
//
// 题解：三维树状数组，会了二维之后，就可以推广到三维了。
//       三维不要去想象，数学推导下。二维要维护四个节点，
//       三维就需要维护八个节点，以及节点的坐标都很有规律。
//       操作本身就是从二重循环到三重，本质不变。
//
// run: $exec < input
// flag: -g
#include <iostream>
#include <cstring>

int const maxn = 101;
int tree[maxn][maxn][maxn];
int n, m;

int lowbit(int x) { return x & -x; }

int query(int x, int y, int z)
{
	int ret = 0;
	for (int ty = y; 0 < x; x -= lowbit(x), y = ty)
		for (int tz = z; 0 < y; y -= lowbit(y), z = tz)
			for (; 0 < z; z -= lowbit(z)) ret += tree[x][y][z];
	return ret;
}

void update(int x, int y, int z, int d)
{
	for (int ty = y; x <= n; x += lowbit(x), y = ty)
		for (int tz = z; y <= n; y += lowbit(y), z = tz)
			for (; z <= n; z += lowbit(z)) tree[x][y][z] += d;
}

int main()
{
	std::ios::sync_with_stdio(false);
	while (std::cin >> n >> m) {
		std::memset(tree, 0, sizeof(tree));
		for (int i = 0, opt, x1, y1, z1, x2, y2, z2; i < m; i++) {
			std::cin >> opt >> x1 >> y1 >> z1;
			if (opt) {
				std::cin >> x2 >> y2 >> z2;
				update(x1, y1, z1, 1);
				update(x2 + 1, y1, z1, 1);
				update(x1, y2 + 1, z1, 1);
				update(x1, y1, z2 + 1, 1);
				update(x1, y2 + 1, z2 + 1, -1);
				update(x2 + 1, y1, z2 + 1, -1);
				update(x2 + 1, y2 + 1, z1, -1);
				update(x2 + 1, y2 + 1, z2 + 1, -1);
			} else
				std::cout << (query(x1, y1, z1) & 1) << '\n';
		}
	}
}

